﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Net;

using modDatos;

namespace modLanGame
{
    public class CServidor
    {
        public CServidor_Datos data;

        public CServidor()
        {
            data = new CServidor_Datos();
            data.ContactosIN = new Socket[5];
            data.ContactosOUT = new Socket[5];      
        }

        public void CrearServidor(string IPServer, int max)
        {
            try
            {
                data.maxConc = max;
                data.ipServer = IPServer;
                IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse(data.ipServer), 7300);
                data.sockServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
           
                data.sockServer.Bind(endPoint);
                 
            }
            catch (Exception ex)
            {
                string lal = ex.ToString();
                throw;
            }
        }

        public void AceptarConexion()
        {
            try
            {
                int coneccionTot = 0;                                
                int puertoReservado = 7300;

                string[] comandos;
                IPEndPoint buffEndPoint;
                Socket buffSocket;                

                byte[] buffByte = new byte[2048];                

                data.sockServer.Listen(data.maxConc);
                pqCmd Command = new pqCmd();

                while (coneccionTot < data.maxConc)
                {

                    data.coneccionEntrantes = coneccionTot;

                    buffSocket = data.sockServer.Accept();
                    if (186 == buffSocket.Receive(buffByte))
                    {
                        Command.inByte(buffByte);

                        comandos = Command.data.command.Split('~');

                        if (comandos[0] == "Conectar")
                        {
                            puertoReservado += 10;

                            //puerto del socket de escucha
                            Command.data.command = puertoReservado.ToString() + "~" + buffSocket.RemoteEndPoint.ToString();

                            buffSocket.Send(Command.outByte());

                            //espero que ese cliente me diga que esta en condiciones de probar el nuevo puerto                     

                            buffSocket.Receive(buffByte);
                            Command.inByte(buffByte);

                            comandos = Command.data.command.Split('~');

                            if (comandos[0] == "sckDedicado")
                            {
                                //socket de escucha                            
                                buffEndPoint = new IPEndPoint(IPAddress.Parse(data.ipServer), puertoReservado);
                                data.ContactosIN[coneccionTot] = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                                data.ContactosIN[coneccionTot].Bind(buffEndPoint);
                                data.ContactosIN[coneccionTot].Listen(10);


                                //a este punto ya tendria creado los sockets de habla y escucha

                                //le informo al cliente que esta todo OK! para que pruebe los socket de habla y escuche
                                Command.data.command = "RunTest";
                                buffSocket.Send(Command.outByte());

                                //uso buff byte para recibir la respuesta por el nuevo socket
                                data.ContactosIN[coneccionTot] = data.ContactosIN[coneccionTot].Accept();
                                data.ContactosIN[coneccionTot].Receive(buffByte);

                                Command.inByte(buffByte);
                                comandos = Command.data.command.Split('~');


                                //socket de habla con la direccio  IP del cliente                            
                                buffEndPoint = new IPEndPoint(IPAddress.Parse(comandos[0]), (puertoReservado + 5));

                                data.ContactosOUT[coneccionTot] = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

                                data.ContactosOUT[coneccionTot].Connect(buffEndPoint);

                                Command.data.command = "ProbandoSckOUT~" + coneccionTot + "~" + data.maxConc;
                                data.ContactosOUT[coneccionTot].Send(Command.outByte());

                                Console.WriteLine("Conexion Establecida");
                                coneccionTot++;
                            }

                        }
                        else
                        {
                            Command.data.command = "NO";
                        }
                    }

                }                
            }
            catch (Exception ex)
            {
                string lal = ex.ToString();
                throw;
            }

            pqCmd cmd = new pqCmd();

            for (int i = 0; i < data.maxConc; i++)
			{
                cmd.data.command = "JugarNow~"+i;
			    data.ContactosOUT[i].Send(cmd.outByte());
			}
        }

        void RecivirPeticion()
        {

        }

        void RecivirDatos()
        {

        }

        void EnviarDatos()
        {

        }
    }
}
